﻿package com.flyee.utils
{
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.events.IEventDispatcher;
	public class EventUtils
	{
		public function EventUtils()
		{
		}
		/**
         * Appends an event handler
         * 为某个可视化组件添加一个事件监听器。允许传入一些自定义的参数对象。
         * 英文注释摘抄自YUI框架的event.js文件中的addListener方法,注释格式也来自那。
         *
         * @method addListener 方法名：addListener
         *
         * @param {IEventDispatcher} mainComponent 
         * 							可添加监听器的组件名。这里允许传入的是实现IEventDispatcher接口的类，因为它声明了方法addEventListener。
         * 							这与实际需要添加监听器的组件有细微不同。
 		 * 							当参数scope没有被传入时，两者一致，表示在该组件的监听器列表中添加一个影响它自身的监听器。
         * 							当参数scope被传入时，则表示在mainComponent组件的监听器列表中添加一个影响scope组件的监听器。
         * @param {String}   		eventType     	
         * 							The type of event to append
		 *							需要监听的事件类型。最好使用Event类提供的常量来赋值
         * @param {Function} 		fn
         * 							The method the event invokes
         * 							用来响应事件的回调函数,您所定义的回调函数第一个参数都应该是
         * @param {Object}   		obj    			
         * 							An arbitrary object that will be 
         *                          passed as a parameter to the handler
         * 							一个自定义的对象将被直接传入响应事件的回调函数fn中,
         * 							如果您自定义的参数数量超过一个，请将它们组织成一个Object再传入，像这样：
         * 							{param1:obj1,param2:obj2,......}
         * @param {DisplayObject} 	scope 监听器影响到的组件，默认值 mainComponent		
         * @param {Boolean}  		useCapture 捕捉可用，默认值 false
         * @param {int}				priority 优先级，默认值 0 
         * @param {Boolean}			useWeakReference 弱类型检查，默认值 false
         * @return {Boolean} True if the action was successful or defered,
         *                        false if one or more of the elements 
         *                        could not have the listener attached,
         *                        or if the operation throws an exception.
         * @static
         * @author 杨川
         * 修改列表： (1)杨川 2008-7-5 15:14:00 创建方法
         * 			(2)杨川 2008-7-7 14:09:00 当obj参数不传入时，应该fn.call(scope,event)
         */
		public static function addListener(mainComponent:IEventDispatcher
											, eventType:String
											, fn:Function
											, obj:Object=null
											, scope:IEventDispatcher=null
											, useCapture:Boolean=false
											, priority:int=0
											, useWeakReference:Boolean=false):Boolean {
			//如果没有指定为哪个可视化组件(mainComponent)添加监听器
			//或者没有指定响应的事件类型(eventType)
			//或者没有指定处理事件的回调函数(fn)
			//那么直接返回false。
			if(mainComponent == null||eventType == null||fn == null) return false;
			if(scope == null) scope = mainComponent;
			// wrap the function so we can return the obj object when
            // the event fires;
			var wrapFn:Function = function(event:Event):Function {
				//见修改列表(2)
				return	obj == null?fn.call(scope,event):fn.call(scope,event,obj); 		
			};
			
			// registe listener
			mainComponent.addEventListener(eventType,wrapFn,useCapture,priority,useWeakReference);
			return true;
		} 

	}
}